import { ElMessage } from 'element-plus'

/**
 * 导出json文件
 * @param {Object} data - 导出的数据
 * @param {String} filename - 导出的文件名
 */
export function exportJson(data, filename) {    
    let blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application/json' })
    let url = URL.createObjectURL(blob)
    let a = document.createElement('a')
    a.href = url
    a.download = filename
    a.click()
    URL.revokeObjectURL(url)
}

/**
 * 将JSON数据导出为CSV文件
 * @param {Array} jsonData - 要导出的JSON数据数组
 * @param {String} filename - 导出的文件名，不包含扩展名
 * @param {Array} [headers] - 自定义表头，如不提供则使用对象的键作为表头
 * @param {String} [delimiter=','] - CSV分隔符，默认为逗号
 */
export function exportJsonToCsv(jsonData, filename, headers = null, delimiter = ',') {
    if (!Array.isArray(jsonData) || jsonData.length === 0) {
        console.error('导出数据必须是非空数组')
        return
    }

    // 如果没有提供自定义表头，则使用第一个对象的键作为表头
    const headerRow = headers || Object.keys(jsonData[0])
    
    // 添加BOM以确保Excel正确识别UTF-8编码
    let csvContent = '\uFEFF'
    
    // 添加表头行
    csvContent += headerRow.join(delimiter) + '\n'
    
    // 添加数据行
    jsonData.forEach(item => {
        const row = headerRow.map(fieldName => {
            // 处理字段值，确保CSV格式正确
            const cell = item[fieldName] === null || item[fieldName] === undefined ? '' : item[fieldName].toString()
            
            // 如果字段包含逗号、引号或换行符，则需要用引号包裹并处理引号转义
            if (cell.includes(delimiter) || cell.includes('"') || cell.includes('\n')) {
                return '"' + cell.replace(/"/g, '""') + '"'
            }
            return cell
        })
        csvContent += row.join(delimiter) + '\n'
    })
    
    // 创建Blob对象并下载
    const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8' })
    const url = URL.createObjectURL(blob)
    const a = document.createElement('a')
    a.href = url
    a.download = filename + '.csv'
    a.click()
    URL.revokeObjectURL(url)
}

/**
 * 从API响应下载文件
 * @param {Object} response - Axios响应对象
 * @param {String} [customFilename] - 自定义文件名，若不提供则使用响应头中的文件名
 * @returns {Boolean} 下载是否成功
 */
export function downloadFileFromResponse(response, customFilename) {
    try {
        // 获取文件类型和文件名
        const contentDisposition = response.headers['content-disposition']
        const contentType = response.headers['content-type']
        console.log(contentDisposition);
        
        // 优先使用自定义文件名
        let filename = customFilename
        
        // 如果没有自定义文件名，尝试从Content-Disposition中获取
        if (!filename && contentDisposition) {
            const filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
            const matches = filenameRegex.exec(contentDisposition)
            if (matches && matches[1]) {
                filename = matches[1].replace(/['"]/g, '')
                // 处理可能的URL编码
                try {
                    filename = decodeURIComponent(filename)
                } catch (e) {
                    // 解码失败，保持原样
                }
            }
        }
        
        console.log(contentType);
        

        // 如果仍然没有文件名，生成一个基于时间戳的默认文件名
        if (!filename) {
            const timestamp = new Date().getTime()
            const defaultExt = contentType ? 
                (contentType.includes('json') ? '.json' : 
                 contentType.includes('csv') ? '.csv' : 
                 contentType.includes('excel') || contentType.includes('spreadsheetml') ? '.xlsx' :
                 contentType.includes('pdf') ? '.pdf' : '.bin') : '.bin'
            
            filename = `download_${timestamp}${defaultExt}`
        }
        
        // 创建Blob对象
        const blob = new Blob([response.data], { type: contentType })
        
        // 创建下载链接并触发下载
        const url = URL.createObjectURL(blob)
        const a = document.createElement('a')
        a.href = url
        a.download = filename
        a.click()
        
        // 释放URL对象
        setTimeout(() => {
            URL.revokeObjectURL(url)
        }, 100)
        
        return true
    } catch (error) {
        console.error('文件下载处理出错:', error)
        throw new Error('文件下载失败')
    }
}

